home *** CD-ROM | disk | FTP | other *** search
/ Risc World 3 / Risc World 3.iso / SOFTWARE / ISSUE2 / PD / VINCE / !ViNCe / c / ip < prev    next >
Text File  |  2002-03-10  |  4KB  |  193 lines

  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. #include "oslib/socket.h"
  7.  
  8. #include "ip.h"
  9.  
  10.  
  11. int ip_create(int udp) {
  12. // returns a socket or -1 (failed)
  13.  
  14.   socket_s socket;
  15.  
  16.   if (udp) {
  17.     if (xsocket_creat(socket_AF_INET, socket_SOCK_DGRAM, socket_IPPROTO_IP,
  18.                     &socket))  return -1;
  19.   } else {
  20.     if (xsocket_creat(socket_AF_INET, socket_SOCK_STREAM, socket_IPPROTO_IP,
  21.                     &socket))  return -1;
  22.   }
  23.   return (int)socket;
  24. }
  25.  
  26.  
  27. int ip_bind(int socket, int addr, int port) {
  28. // returns 0 (failed) or 1 (ok)
  29.   socket_sockaddr_in sockaddr;
  30.   int i, p;
  31.  
  32.   p = (port &255)<<8;
  33.   p |= port>>8;
  34.  
  35.   sockaddr.af = 2;
  36.   sockaddr.port = p;
  37.   sockaddr.addr = addr;
  38.   for (i = 0; i < 8; i++)  sockaddr.data[i] = 0;
  39.  
  40.   if (xsocket_bind((socket_s)socket, (socket_sockaddr *)&sockaddr, 16))
  41.     return 0;
  42.   return 1;
  43. }
  44.  
  45.  
  46. int ip_connect(int socket, int addr, int port) {
  47. // returns 0 (failed) or 1 (ok)
  48.   socket_sockaddr ipaddr;
  49.  
  50.   ip_writeaddr(&ipaddr, addr, port);     // build address from port/addr
  51.  
  52.   if (xsocket_connect((socket_s)socket, &ipaddr, 16))
  53.     return 0;
  54.   return 1;
  55. }
  56.  
  57.  
  58. void ip_close(int socket) {
  59.  
  60.   xsocket_close((socket_s)socket);
  61. }
  62.  
  63.  
  64. int ip_read(int socket, void *buffer, int size) {
  65. // returns number of bytes read or -1
  66.   int read;
  67.   if (xsocket_read((socket_s)socket, (byte *)buffer, size, &read))
  68.     return -1;
  69.   return read;
  70. }
  71.  
  72.  
  73. int ip_write(int socket, void *buffer, int size) {
  74. // returns the number of bytes written or -errorcode
  75.   int written;
  76.  
  77.   if (xsocket_write((socket_s)socket, (byte *)buffer, size, &written))
  78.     return -written;
  79.   return written;
  80. }
  81.  
  82.  
  83. int ip_writestring(int socket, char *string) {
  84.  
  85.   return ip_write(socket, string, strlen(string));
  86. }
  87.  
  88.  
  89. int ip_nonblocking(int socket) {
  90. // returns 0 (failed) or 1 (ok)
  91.  
  92.   int arg;
  93.  
  94.   arg = 1;
  95.   if (xsocket_ioctl((socket_s)socket, 0x8004667e, (byte *)&arg))  return 0;
  96.   return 1;
  97. }
  98.  
  99.  
  100. int ip_ready(int socket) {
  101. // returns number of bytes available on the socket
  102.  
  103.   int arg;
  104.  
  105.   if (xsocket_ioctl((socket_s)socket, 0x4004667f, (byte *)&arg))  return -1;
  106.   return arg;
  107. }
  108.  
  109.  
  110. int ip_linger(int socket, int secs) {
  111. // returns 0 (failed) or 1 (ok)
  112.   int arg[2];
  113.  
  114.   arg[0] = 1;
  115.   arg[1] = secs;
  116.   return ip_setsocketopt(socket, 0x80, &arg, 8);
  117. }
  118.  
  119.  
  120.  
  121. int ip_setsocketopt(int socket, int opt, void *arg, int argsize) {
  122.  
  123.   if (xsocket_setsockopt((socket_s)socket, 0xffff, (socket_so)opt,
  124.               arg, argsize))  return 0;
  125.   return 1;
  126. }
  127.  
  128.  
  129.  
  130. int ip_select(int max, char *read, char *write, char *except) {
  131. // returns 0 (nothing) or -1 (error) or count
  132.   socket_timeval timeout;
  133.   int found;
  134.  
  135.   timeout.sec = 0;
  136.   timeout.usec = 0;
  137.  
  138.   if (xsocket_select(max, (void *)read, (void *)write, (void *)except,
  139.             &timeout, &found))  return -1;
  140.  
  141.   return found;
  142. }
  143.  
  144.  
  145.  
  146. int ip_listen(int socket) {
  147. // returns 0 (failed) or 1 (ok)
  148.   if (xsocket_listen((socket_s)socket, 8))  return 0;
  149.   return 1;
  150. }
  151.  
  152.  
  153. int ip_accept(int socket, char *host) {
  154. // returns a socket or -1 (failed)
  155.   int size;
  156.   socket_s sock;
  157.  
  158.   if (xsocket_accept((socket_s)socket, (socket_sockaddr *)host,
  159.                      &size, &sock))    return -1;
  160.   return (int)sock;;
  161. }
  162.  
  163.  
  164. void fd_clear(char *select, int socket) {
  165.   select[socket>>3] &= ~(1<< (socket &7));
  166. }
  167.  
  168. void fd_set(char *select, int socket) {
  169.   select[socket>>3] |= 1<< (socket &7);
  170. }
  171.  
  172. int fd_is_set(char *select, int socket) {
  173.   return select[socket>>3] & (1<< (socket &7));
  174. }
  175.  
  176.  
  177. void ip_writeaddr(socket_sockaddr *ip, int addr, int port) {
  178.  
  179.   int i;
  180.   char *ipi;
  181.  
  182.   ipi = (char *)ip;
  183.   ipi[IPADDR_FAMILY+0] = 2;
  184.   ipi[IPADDR_FAMILY+1] = 0;
  185.   ipi[IPADDR_PORT+0]   = (port>>8)&255;
  186.   ipi[IPADDR_PORT+1]   = port&255;
  187.   ipi[IPADDR_ADDR+3]   = (addr>>24)&255;
  188.   ipi[IPADDR_ADDR+2]   = (addr>>16)&255;
  189.   ipi[IPADDR_ADDR+1]   = (addr>>8)&255;
  190.   ipi[IPADDR_ADDR+0]   = addr&255;
  191.   for (i = IPADDR_DUMMY; i < 16; i++)  ipi[i]  = 0;
  192. }
  193.